/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Hilos;

import ClasesBase.Jugador;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.LinkedList;

/**
 *
 * @author Francisco
 */
public class HiloServidor extends Thread {

    private Socket socket = null;
    private final SocketServidor padre;
    private String nickname;
    private String mensajeParaCliente;

    public HiloServidor(Socket socket, SocketServidor padre) {
        this.socket = socket;
        this.padre = padre;
        this.mensajeParaCliente = "";
    }

    public void run() {
        try {
            System.out.println("Entra aca");
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = null;
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                while (in.ready()) {
                    String mensaje = in.readLine();
                    this.procesarMensaje(mensaje);
                }
                if (!mensajeParaCliente.isEmpty()) {
                    out.println(mensajeParaCliente);
                    if (mensajeParaCliente.compareTo("ServidorLleno") == 0) {
                        stop();
                    }
                    mensajeParaCliente = "";
                }
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

    public void crearMensajeJugadores() {
        String mensaje = "Jugadores&";
        LinkedList<Jugador> jugadores = padre.getJugadores();
        for (Jugador jugador : jugadores) {
            mensaje += jugador.getNickname() + "-" + jugador.getPieza() + "&";
        }
        mensajeParaCliente = mensaje;
    }

    public void cerrarServidor() {
        mensajeParaCliente = "ServidorCancelo";
    }

    public void procesarMensaje(String mensaje) {
        String mensajes[] = mensaje.split(";");
        String nick;
        for (int i = 0; i < mensajes.length; i++) {
            mensaje = mensajes[i];
            int primerOcurrencia = mensaje.indexOf("-");
            int segundaOcurrencia;
            if (primerOcurrencia == -1) {
                if (padre.getJugadores().size() == 4 || padre.getComenzoPartida()) {
                    mensajeParaCliente = "ServidorLleno";
                    return;
                }
                nick = mensaje;
                if (!padre.existeJugador(nick)) {
                    this.nickname = nick;
                    padre.add(nick);
                } else {
                    mensajeParaCliente = nick + "-EnUso-";
                }
                return;
            } else {
                nick = mensaje.substring(0, primerOcurrencia);
                segundaOcurrencia = mensaje.indexOf("-", primerOcurrencia + 1);
                if (segundaOcurrencia == -1) {
                    padre.eliminar(nick);
                    return;
                }
            }
            String campoClave = mensaje.substring(primerOcurrencia + 1, segundaOcurrencia);
            String idTerreno;
            switch (campoClave) {
                case "resultado de dados en comienzo":
                    int resultado = Integer.parseInt(mensaje.substring(segundaOcurrencia + 1));
                    padre.aniadirResultadoComienzo(resultado, nick);
                    break;
                case "ResultadoTirada":
                    int terceraOcurrencia = mensaje.indexOf("-", segundaOcurrencia + 1);
                    int dado1 = Integer.parseInt(mensaje.substring(segundaOcurrencia + 1, terceraOcurrencia));
                    int dado2 = Integer.parseInt(mensaje.substring(terceraOcurrencia + 1));
                    padre.informarDadosJugador(nick, dado1, dado2);
                    //      mensajeParaCliente = nickname+"-TiroDados-"+total;
                    break;
                case "Cerro":
                    padre.jugadorAbandono(nick);
                    break;
                case "Compra":
                    idTerreno = mensaje.substring(segundaOcurrencia + 1);
                    padre.jugadorCompra(nick, idTerreno);
                    break;
                case "NoCompra":
                    idTerreno = mensaje.substring(segundaOcurrencia + 1);
                    padre.subasta(nick, idTerreno);
                    break;
                case "SubastaOferta":
                    String oferta = mensaje.substring(segundaOcurrencia + 1);
                    padre.procesarOferta(nick, oferta);
                    break;
                case "ResultadoTiradaServicio":
                    terceraOcurrencia = mensaje.indexOf("-", segundaOcurrencia + 1);
                    int cuartaOcurrencia = mensaje.indexOf("-", terceraOcurrencia + 1);
                    dado1 = Integer.parseInt(mensaje.substring(segundaOcurrencia + 1, terceraOcurrencia));
                    dado2 = Integer.parseInt(mensaje.substring(terceraOcurrencia + 1, cuartaOcurrencia));
                    String nickDuenioServicio = mensaje.substring(cuartaOcurrencia + 1);
                    padre.cobroAlquilerServicio(dado1, dado2, nickDuenioServicio, nick);
                    break;
                case "AvanceDePosicion":
                    int posicion = Integer.parseInt(mensaje.substring(segundaOcurrencia + 1));
                    padre.informarPosicionJugador(nick, posicion);
                    break;
                case "SaleCarcel":
                    String saleCarcel = mensaje.substring(segundaOcurrencia + 1);
                    padre.salirCarcel(nick, saleCarcel);
                    break;
                case "listarPropiedades":
                    boolean esPorPreso = Boolean.parseBoolean(mensaje.substring(segundaOcurrencia + 1));
                    padre.listarPropiedadesJugador(nick, esPorPreso);
                    break;
                case "hipotecar":
                    int tercer = mensaje.indexOf("-", segundaOcurrencia + 1);
                    String propiedades = mensaje.substring(segundaOcurrencia + 1);
                    boolean hipotecaFinal = false;
                    if (tercer != -1) {
                        propiedades = mensaje.substring(segundaOcurrencia + 1, tercer);
                        hipotecaFinal = Boolean.parseBoolean(mensaje.substring(tercer + 1));
                    }
                    padre.hipotecar(nick, propiedades, hipotecaFinal);
                    break;
                case "listarPropiedadesHipotecadas":
                    padre.listarPropiedadesHipotecadas(nick);
                    break;
                case "deshipotecar":
                    propiedades = mensaje.substring(segundaOcurrencia + 1);
                    padre.deshipotecar(nick, propiedades);
                    break;
                case "CanceloAccion":
                    padre.canceloAccion(nick);
                    break;
                case "listarPropiedadesConstruccion":
                    padre.listarPropiedadesConstruccion(nick);
                    break;
                case "listarPropiedadesDeconstruccion":
                    padre.listarPropiedadesDeconstruccion(nick);
                    break;
                case "construir":
                    tercer = mensaje.indexOf("+", segundaOcurrencia + 1);
                    propiedades = mensaje.substring(segundaOcurrencia + 1);
                    boolean comprarCasasFinal = false;
                    if (tercer != -1) {
                        propiedades = mensaje.substring(segundaOcurrencia + 1, tercer);
                        comprarCasasFinal = Boolean.parseBoolean(mensaje.substring(tercer + 1));
                    }
                    padre.construirCasas(propiedades, nick, comprarCasasFinal);
                    break;
                case "ComprarCasilla":
                    String propiedad = mensaje.substring(segundaOcurrencia + 1);
                    padre.comprarCasilla(nick, propiedad);
                    break;
                case "NoCompraC":
                    idTerreno = mensaje.substring(segundaOcurrencia + 1);
                    padre.subastaC(nick, idTerreno);
                    break;
                case "PagarPorHipoConstru":
                    padre.pagarPorHipoConstru(nick);
                    break;
                case "HipotecoPorPreso":
                    padre.hipotecoPorPreso(nick);
                    break;
                case "HipotecoPorSubasta":
                    padre.hipotecaPorSubasta(nick);
                    break;
                case "NoCompraSub":
                    padre.noCompraPorSub(nick);
                    break;
                case "listarPosesionesComerciar":
                    String nickPart = mensaje.substring(segundaOcurrencia + 1);
                    padre.listarPropiedadesJugadorParticular(nick, nickPart);
                    break;
                case "propuestaIntercambio":
                    String propuesta = mensaje.substring(segundaOcurrencia + 1);
                    padre.propuestaComerciar(nick, propuesta);
                    break;
                case "respuestaIntercambio":
                    propuesta = mensaje.substring(segundaOcurrencia + 1);
                    padre.respuestaPropuestaComerciar(nick, propuesta);
                    break;
                case "preguntarCierre":
                    padre.preguntarCierre(nick);
                    break;
            }
        }
    }

    public String getNickname() {
        return nickname;
    }

    public void parar() {
        this.stop();
    }

    public void comenzarPartida() {
        mensajeParaCliente = "Comenzar";
    }

    public void enviarMensaje(String mensaje) {
        mensajeParaCliente = mensaje;
    }

    boolean isVacio() {
        if (mensajeParaCliente.isEmpty()) {
            return true;
        }
        return false;
    }
}
